Narativna struktura i publička amplifikacija: Koje okvire publika nagrađuje u hrvatskom medijskom prostoru?

Radna verzija za časopis

Author

Media Analysis Research

Published

February 10, 2026

Sažetak

Istraživanja pokazuju da se lažne vijesti šire brže i dalje od istinitih, a moralno i emocionalno nabijen sadržaj generira više dijeljenja. No manje je poznato kako narativni okviri, kao strukturne jedinice medijskog diskursa, utječu na publički angažman. Ovaj rad istražuje odnos između narativnih okvira i publičke amplifikacije u hrvatskom web medijskom prostoru na korpusu od 443,138 članaka (2021.–2024.). Koristeći negativne binomijalne regresijske modele, ispitujemo koji okviri predviđaju više interakcija, je li sadržaj s višom strukturnom bliskošću dezinformacijskim narativima nagrađen većim angažmanom i razlikuje li se dinamika amplifikacije između katoličkih i ostalih medija. Rezultati otkrivaju specifične okvire koji sistematski predviđaju viši angažman, pri čemu se obrazac razlikuje između tipova medija. Nalazi imaju implikacije za razumijevanje ekonomskih poticaja koji oblikuju medijski ekosustav i potencijalnih mehanizama kojima se narativne strukture bliske dezinformacijskom ekosustavu šire.

1 Uvod

Jedna od najcitiranijih studija u istraživanju dezinformacija, (vosoughi2018spread?), pokazuje da se lažne vijesti na Twitteru šire šest puta brže od istinitih, dosežu više korisnika i izazivaju izraženije emocionalne reakcije. (brady2017emotion?) demonstriraju da moralno i emocionalno nabijen sadržaj generira 20% više dijeljenja po dodatnoj moralnoj ili emocionalnoj riječi. (robertson2023negativity?) pokazuju da negativni sadržaj konzistentno privlači više klikova i dužu čitanost. Ovi nalazi upućuju na to da obilježja koja karakteriziraju dezinformacijski ekosustav, poput emocionalnog naboja, moralne osude i konspirativnih narativa, istovremeno služe kao poticaj za publički angažman.

Ovo postavlja uznemirujuće pitanje: postoji li strukturni poticaj za produkciju sadržaja čije su narativne karakteristike bliske dezinformacijskom ekosustavu? Ako članci s konspirativnim okvirima ili okvirima institucionalnog nepovjerenja generiraju više klikova, komentara i dijeljenja, medijski izdavači imaju ekonomski poticaj za produkciju takvog sadržaja, neovisno o namjeri ili istinitosti. (pennycook2021psychology?) nazivaju ovo “attention economy” dinamikom: platforme i izdavači natječu se za ograničenu pažnju publike, a sadržaj koji izaziva jake emocionalne reakcije ima kompetitivnu prednost.

Za religijske medije ova dinamika ima specifičnu relevantnost. Katolički mediji operiraju u narativnom prostoru koji legitimno uključuje moralne okvire, vrijednosne pozicije i kritiku sekularnih institucija. No ti isti okviri, osobito kada su kombinirani s konspirativnim ili populističkim elementima, mogu generirati pojačani publički angažman. Pitanje je je li to slučaj i u kojoj mjeri.

Dosadašnja istraživanja dominantno se fokusiraju na platforme društvenih mreža i pojedinačne objave (vosoughi2018spread?; brady2017emotion?; zollo2017debunking?). Analiza angažmana na razini cjelovitih web članaka manje je zastupljena u literaturi, dijelom zbog teškoća u prikupljanju metrika angažmana za web sadržaj. Naš korpus, prikupljen putem Determ platforme, uključuje metrike angažmana (interakcije, dijeljenja, komentari, doseg) za značajan udio članaka, što nam omogućuje pionirsku analizu na razini hrvatskog medijskog prostora.

Istraživanje je vođeno trima istraživačkim pitanjima.

IP1: Koji okviri generiraju više angažmana? Predviđa li prisutnost specifičnih narativnih okvira viši publički angažman, mjereno brojem interakcija, nakon kontrole za tip medija, duljinu članka i vremensko razdoblje?

IP2: Nagrađuje li publika narativnu strukturu blisku dezinformacijskom ekosustavu? Predviđa li viši Narrative Proximity Index (NPI) viši angažman, i je li taj odnos linearan ili nelinearan?

IP3: Razlikuje li se dinamika amplifikacije između tipova medija? Jesu li okviri koji generiraju angažman u katoličkim medijima isti kao oni koji generiraju angažman u ostalim medijima, ili postoji specifičan obrazac amplifikacije za katolički medijski prostor?

2 Teorijski okvir

2.1 Ekonomija pažnje i narativna selekcija

(pennycook2021psychology?) predlažu model u kojem se širenje dezinformacija ne objašnjava primarno motiviranim rezoniranjem (ljudi ne dijele lažne vijesti jer žele širiti dezinformacije) nego nedostatkom pažnje (ljudi dijele bez kritičke evaluacije, vođeni emocionalnom reakcijom). Ova perspektiva sugerira da obilježja sadržaja, osobito emocionalni naboj i moralna jasnoća, djeluju kao automatizirani pokretači dijeljenja. (brady2017emotion?) empirijski potvrđuju ovaj mehanizam pokazujući da svaka dodatna moralno-emocionalna riječ u tweetu povećava vjerojatnost retvitanja za 20%.

(robertson2023negativity?) proširuju ovaj nalaz na web sadržaj pokazujući da negativnost konzistentno predviđa više klikova i dulju čitanost, efekt koji je robustan na kontrole za temu, izvor i demografske karakteristike čitatelja. Za naše istraživanje ovo je osobito relevantno jer okviri poput INSTITUTIONAL_DISTRUST i MORAL_DECAY inherentno nose negativni valenciju.

2.2 Amplifikacija u fragmentiranom medijskom sustavu

(benkler2018network?) pokazuju da amplifikacija nije jednolika: isti sadržaj generira različite razine angažmana ovisno o medijskom ekosustavu u kojem cirkulira. U zatvorenim narativnim sustavima (poput desnog medijskog prostora u SAD-u), sadržaj koji potvrđuje postojeće narativne okvire generira disproporcionalno veći angažman jer rezonira s očekivanjima publike. (bail2018exposure?) demonstriraju komplementarnu dinamiku: izloženost sadržaju koji proturječi vlastitim pozicijama može pojačati polarizaciju umjesto da je ublaži.

Ova perspektiva sugerira da narativni okviri ne samo odražavaju uredničke odluke nego su i predmet selekcijskog pritiska od strane publike. Okviri koji generiraju više angažmana dobivaju veću vidljivost, što pojačava njihovu zastupljenost u medijskom ekosustavu, što pak privlači publiku koja očekuje te okvire, stvarajući pozitivnu povratnu petlju.

2.3 Specifičnost religijskog medijskog prostora

(guess2020exposure?) pokazuju da je izloženost nepouzdanim izvorima visoko koncentrirana u malom segmentu populacije. Analogno, možemo očekivati da je angažman s okvirima poput CONSPIRACY ili FOREIGN_THREAT koncentriran u specifičnim medijskim tipovima. Katolički mediji su osobito zanimljiv slučaj jer njihova publika ima specifičan vrijednosni profil koji može pojačavati rezonanciju određenih okvira (npr. FAITH_DEFENCE ili MORAL_DECAY) dok iste okvire publika drugih medija može ignorirati.

3 Podaci i metode

3.1 Korpus i metrike angažmana

Koristimo isti korpus web članaka opisan u pratećim radovima. Ključna razlika je fokus na metrike angažmana koje Determ platforma bilježi za web sadržaj.

Show code
# Check which engagement columns are available and have data
eng_summary <- tibble(
  Metrika = engagement_cols,
  N_dostupno = sapply(engagement_cols, function(col) sum(!is.na(full_corpus[[col]]) & full_corpus[[col]] > 0)),
  Medijan = sapply(engagement_cols, function(col) median(full_corpus[[col]][full_corpus[[col]] > 0], na.rm = TRUE)),
  Prosjek = sapply(engagement_cols, function(col) round(mean(full_corpus[[col]], na.rm = TRUE), 1)),
  Maks = sapply(engagement_cols, function(col) max(full_corpus[[col]], na.rm = TRUE))
) |>
  arrange(desc(N_dostupno))

kable(eng_summary,
      caption = "Tablica 1. Dostupnost i distribucija metrika angažmana",
      format.args = list(big.mark = ",")) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Tablica 1. Dostupnost i distribucija metrika angažmana
Metrika N_dostupno Medijan Prosjek Maks
REACH 413,905 433.000000 2,205.9 9,064,560.00000
TOTAL_REACTIONS_COUNT 256,490 31.000000 91.5 257,884.00000
VIRALITY 256,490 1.000000 1.0 1,480.40000
INTERACTIONS 256,482 31.000000 91.5 257,884.00000
SHARE_COUNT 253,911 3.000000 10.7 177,371.00000
ENGAGEMENT_RATE 243,661 3.897008 3.5 11.11111
LIKE_COUNT 226,849 25.000000 63.1 60,827.00000
COMMENT_COUNT 135,956 11.000000 17.8 22,452.00000
VIEW_COUNT 0 NA 0.0 0.00000
LOVE_COUNT 0 NA 0.0 0.00000
WOW_COUNT 0 NA 0.0 0.00000
HAHA_COUNT 0 NA 0.0 0.00000
SAD_COUNT 0 NA 0.0 0.00000
ANGRY_COUNT 0 NA 0.0 0.00000
Show code
# Select primary outcome variable: INTERACTIONS (most available), fallback to others
if ("INTERACTIONS" %in% engagement_cols && sum(full_corpus$INTERACTIONS > 0, na.rm = TRUE) > 1000) {
  primary_outcome <- "INTERACTIONS"
} else if ("TOTAL_REACTIONS_COUNT" %in% engagement_cols && sum(full_corpus$TOTAL_REACTIONS_COUNT > 0, na.rm = TRUE) > 1000) {
  primary_outcome <- "TOTAL_REACTIONS_COUNT"
} else {
  # Use whatever has most nonzero values
  primary_outcome <- eng_summary$Metrika[1]
}

cat("Primary outcome variable:", primary_outcome, "\n")
Primary outcome variable: INTERACTIONS 
Show code
cat("Articles with", primary_outcome, "> 0:",
    format(sum(full_corpus[[primary_outcome]] > 0, na.rm = TRUE), big.mark = ","), "\n")
Articles with INTERACTIONS > 0: 256,482 
Show code
cat("Median (nonzero):",
    median(full_corpus[[primary_outcome]][full_corpus[[primary_outcome]] > 0], na.rm = TRUE), "\n")
Median (nonzero): 31 
Show code
cat("Mean:", round(mean(full_corpus[[primary_outcome]], na.rm = TRUE), 1), "\n")
Mean: 91.5 

Ne svi članci u web korpusu imaju zabilježene metrike angažmana. Dostupnost ovisi o tome prati li Determ interakcije za taj izvor. Analiza je ograničena na podskup članaka s dostupnim podatcima o angažmanu. Ovo uvodi potencijalni selekcijski bias jer izvori s više interakcija mogu biti bolje praćeni.

Show code
# Create analysis dataset: only articles with engagement data
analysis_data <- full_corpus |>
  filter(!is.na(.data[[primary_outcome]]) & .data[[primary_outcome]] >= 0) |>
  mutate(
    engagement = .data[[primary_outcome]],
    log_engagement = log1p(engagement),
    has_engagement = engagement > 0,
    log_words = log(pmax(word_count, 1)),
    media_fct = relevel(factor(media_type), ref = "Other"),
    phase_fct = factor(narrative_phase),
    is_catholic = media_type == "Catholic"
  ) |>
  filter(!is.na(narrative_phase))

n_analysis <- nrow(analysis_data)
n_with_engagement <- sum(analysis_data$has_engagement)

cat("Analysis dataset:", format(n_analysis, big.mark = ","), "articles\n")
Analysis dataset: 443,138 articles
Show code
cat("With engagement > 0:", format(n_with_engagement, big.mark = ","),
    "(", round(n_with_engagement / n_analysis * 100, 1), "%)\n")
With engagement > 0: 256,482 ( 57.9 %)

3.2 Analitička strategija

Koristimo negativnu binomijalnu regresiju (negative binomial regression) jer je zavisna varijabla (broj interakcija) prebrojivi podatak (count data) s izrazitom desnom asimetrijom i overdispersion (varijanca značajno veća od prosjeka), što čini standardnu Poissonovu regresiju neprimjerenom (hilbe2011negative?).

Za IP1 procjenjujemo model:

\[\text{engagement}_i \sim \text{NB}(\mu_i, \theta)\] \[\log(\mu_i) = \beta_0 + \sum_{j=1}^{8} \beta_j \cdot \text{frame}_{ij} + \gamma \cdot \text{media\_type}_i + \delta \cdot \text{phase}_i + \lambda \cdot \log(\text{word\_count}_i)\]

gdje je NB negativna binomijalna distribucija s parametrima \(\mu\) (očekivana vrijednost) i \(\theta\) (disperzija). Koeficijenti se interpretiraju kao Incidence Rate Ratios (IRR): IRR od 1.30 za okvir CONSPIRACY znači da članci s tim okvirom generiraju 30% više interakcija nego članci bez njega, uz ostale uvjete jednake.

Za IP2 zamjenjujemo individualne okvire kompozitnim NPI indeksom i dodajemo kvadratni član za testiranje nelinearnosti.

Za IP3 procjenjujemo zasebne modele za katoličke i ostale medije te uspoređujemo koeficijente.

4 Rezultati

4.1 Eksplorativna analiza angažmana

Show code
ggplot(analysis_data |> filter(engagement > 0),
       aes(x = media_fct, y = log_engagement, fill = media_fct)) +
  geom_boxplot(alpha = 0.7, outlier.size = 0.3, outlier.alpha = 0.15) +
  scale_fill_manual(values = media_colors, guide = "none") +
  coord_flip() +
  labs(x = NULL, y = paste0("log(1 + ", primary_outcome, ")"))
Figure 1: Slika 1. Distribucija angažmana (log skala) po tipu medija
Show code
eng_by_media <- analysis_data |>
  group_by(media_type) |>
  summarise(
    N = n(),
    `% s angažmanom` = round(mean(has_engagement) * 100, 1),
    Medijan = median(engagement, na.rm = TRUE),
    Prosjek = round(mean(engagement, na.rm = TRUE), 1),
    SD = round(sd(engagement, na.rm = TRUE), 1),
    Q90 = quantile(engagement, 0.90, na.rm = TRUE),
    .groups = "drop"
  ) |>
  arrange(desc(Prosjek))

kable(eng_by_media, format.args = list(big.mark = ",")) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Table 1: Tablica 2. Angažman po tipu medija
media_type N % s angažmanom Medijan Prosjek SD Q90
Tabloid 20,720 74.0 25 214.6 894.4 461
Liberal 28,160 74.3 18 203.3 722.7 429
Conservative 18,516 53.9 2 103.3 923.8 170
Catholic 92,915 45.6 0 101.2 754.7 167
Regional 25,415 65.1 9 79.7 335.2 155
Other 256,216 58.9 3 66.3 883.7 102
Business 1,196 46.4 0 32.7 176.2 55

4.1.1 Angažman i okviri: bivarijatni pregled

Prije formalnog modeliranja, korisno je vizualizirati kako se prosječni angažman razlikuje za članke koji aktiviraju pojedine okvire u usporedbi s onima koji ih ne aktiviraju.

Show code
frame_eng <- lapply(frame_cols, function(fc) {
  fname <- str_remove(fc, "frame_")
  analysis_data |>
    group_by(present = .data[[fc]]) |>
    summarise(
      mean_eng = mean(engagement, na.rm = TRUE),
      median_eng = median(engagement, na.rm = TRUE),
      n = n(),
      .groups = "drop"
    ) |>
    mutate(frame = fname)
}) |>
  bind_rows()

frame_eng_wide <- frame_eng |>
  pivot_wider(
    id_cols = frame,
    names_from = present, 
    values_from = mean_eng, 
    names_prefix = "present_"
  ) |>
  mutate(
    ratio = round(present_TRUE / pmax(present_FALSE, 0.01), 2),
    diff = round(present_TRUE - present_FALSE, 1)
  ) |>
  arrange(desc(ratio))

# Left panel: means
p1 <- frame_eng |>
  mutate(present = ifelse(present, "S okvirom", "Bez okvira")) |>
  ggplot(aes(x = reorder(frame, mean_eng), y = mean_eng, fill = present)) +
  geom_col(position = "dodge", alpha = 0.85, width = 0.7) +
  coord_flip() +
  scale_fill_manual(values = c("S okvirom" = "#e41a1c", "Bez okvira" = "#377eb8")) +
  labs(x = NULL, y = paste0("Prosječni ", primary_outcome), fill = NULL)

# Right panel: ratio
p2 <- ggplot(frame_eng_wide, aes(x = reorder(frame, ratio), y = ratio)) +
  geom_col(fill = "#2c7bb6", alpha = 0.85, width = 0.7) +
  geom_hline(yintercept = 1, linetype = "dashed", color = "gray50") +
  geom_text(aes(label = sprintf("%.2f", ratio)), hjust = -0.1, size = 3.5) +
  coord_flip() +
  labs(x = NULL, y = "Omjer (s okvirom / bez okvira)") +
  expand_limits(y = max(frame_eng_wide$ratio, na.rm = TRUE) * 1.15)

p1 + p2 + plot_layout(widths = c(1.2, 1))
Figure 2: Slika 2. Prosječni angažman za članke s i bez svakog okvira. Omjer (desni panel) pokazuje koliko puta je angažman viši kada je okvir prisutan.
Show code
frame_eng_table <- frame_eng_wide |>
  mutate(
    present_FALSE = round(present_FALSE, 1),
    present_TRUE = round(present_TRUE, 1),
    diff = round(diff, 1)
  )

kable(frame_eng_table[, c("frame", "present_FALSE", "present_TRUE", "diff", "ratio")],
      col.names = c("Okvir", "Prosjek (bez)", "Prosjek (s okvirom)", "Razlika", "Omjer")) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Table 2: Tablica 3. Bivarijatna usporedba angažmana po okviru
Okvir Prosjek (bez) Prosjek (s okvirom) Razlika Omjer
MORAL_DECAY 86.7 159.7 73.1 1.84
TRADITIONAL_VALUES 80.5 99.1 18.6 1.23
INSTITUTIONAL_DISTRUST 86.9 102.9 16.0 1.18
CONSPIRACY 90.9 107.4 16.6 1.18
SOVEREIGNTY 91.0 105.3 14.4 1.16
FOREIGN_THREAT 91.3 104.6 13.2 1.14
MEDIA_CRITIQUE 91.4 96.5 5.2 1.06
FAITH_DEFENCE 91.5 76.8 -14.8 0.84

Omjer iznad 1 znači da članci s okvirom imaju viši prosječni angažman. Ovi bivarijatni rezultati ne kontroliraju za tip medija, duljinu članka ni vremensko razdoblje, stoga ih treba tumačiti s oprezom. Formalni model slijedi u nastavku.

4.2 Negativna binomijalna regresija (IP1)

4.2.1 Model 1: Individualni okviri

Show code
# Model 1: engagement ~ all frames + media_type + phase + log_words
formula_m1 <- as.formula(paste0(
  "engagement ~ ",
  paste(frame_cols, collapse = " + "),
  " + media_fct + phase_fct + log_words"
))

m1 <- MASS::glm.nb(formula_m1, data = analysis_data)

m1_tidy <- tidy(m1, conf.int = TRUE, exponentiate = TRUE)
Show code
m1_frames <- m1_tidy |>
  filter(str_detect(term, "^frame_")) |>
  mutate(
    term = str_remove(term, "frame_"),
    across(c(estimate, conf.low, conf.high), ~round(.x, 3)),
    p_display = ifelse(p.value < 0.001, "< 0.001", sprintf("%.3f", p.value)),
    sig = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01  ~ "**",
      p.value < 0.05  ~ "*",
      TRUE            ~ ""
    )
  ) |>
  arrange(desc(estimate)) |>
  dplyr::select(term, estimate, conf.low, conf.high, p_display, sig)

kable(m1_frames,
      col.names = c("Okvir", "IRR", "95% CI donji", "95% CI gornji", "p", "")) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Table 3: Tablica 4. Negativna binomijalna regresija: Incidence Rate Ratios za narativne okvire (kontrolirano za tip medija, fazu i duljinu članka)
Okvir IRR 95% CI donji 95% CI gornji p
MORAL_DECAYTRUE 1.582 1.532 1.635 < 0.001 ***
TRADITIONAL_VALUESTRUE 1.092 1.074 1.110 < 0.001 ***
SOVEREIGNTYTRUE 1.070 1.023 1.119 0.003 **
INSTITUTIONAL_DISTRUSTTRUE 0.965 0.946 0.983 < 0.001 ***
MEDIA_CRITIQUETRUE 0.965 0.912 1.023 0.228
CONSPIRACYTRUE 0.964 0.923 1.006 0.090
FOREIGN_THREATTRUE 0.950 0.874 1.035 0.235
FAITH_DEFENCETRUE 0.813 0.727 0.912 < 0.001 ***

Koeficijenti su prikazani kao Incidence Rate Ratios (IRR). Ovo je ključno za pravilnu interpretaciju. IRR od 1.25 znači da članci s tim okvirom generiraju 25% više interakcija nego članci bez njega, držeći sve ostale varijable konstantnima. IRR od 0.85 znači 15% manje interakcija. IRR od 1.00 znači da okvir nema efekt na angažman.

Show code
ggplot(m1_frames, aes(x = reorder(term, estimate), y = estimate)) +
  geom_point(size = 3, color = "#e41a1c") +
  geom_errorbar(aes(ymin = conf.low, ymax = conf.high), width = 0.2, color = "#e41a1c") +
  geom_hline(yintercept = 1, linetype = "dashed", color = "gray50") +
  coord_flip() +
  labs(x = NULL, y = "Incidence Rate Ratio")
Figure 3: Slika 3. Incidence Rate Ratios za narativne okvire (Model 1). Crvena linija označava IRR = 1 (bez efekta).
Show code
m1_media <- m1_tidy |>
  filter(str_detect(term, "^media_fct")) |>
  mutate(
    term = str_remove(term, "media_fct"),
    across(c(estimate, conf.low, conf.high), ~round(.x, 3)),
    p_display = ifelse(p.value < 0.001, "< 0.001", sprintf("%.3f", p.value))
  ) |>
  arrange(desc(estimate)) |>
  dplyr::select(term, estimate, conf.low, conf.high, p_display)

kable(m1_media,
      col.names = c("Tip medija", "IRR", "CI donji", "CI gornji", "p")) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Table 4: Tablica 5. Incidence Rate Ratios za tip medija (referentna kategorija: Other)
Tip medija IRR CI donji CI gornji p
Tabloid 3.285 3.163 3.413 < 0.001
Liberal 3.232 3.128 3.342 < 0.001
Conservative 1.513 1.454 1.575 < 0.001
Catholic 1.286 1.260 1.313 < 0.001
Regional 1.218 1.176 1.261 < 0.001
Business 0.588 0.507 0.688 < 0.001

Koeficijent za tip medija pokazuje bazalnu razliku u angažmanu između medijskih tipova, neovisnu o okvirima. Ovo je važno jer neki mediji imaju veću publiku neovisno o narativnoj strategiji.

Show code
cat("Model 1: Dijagnostika\n")
Model 1: Dijagnostika
Show code
cat("=====================\n")
=====================
Show code
cat("N:", nrow(analysis_data), "\n")
N: 443138 
Show code
cat("Theta (disperzija):", round(m1$theta, 3), "\n")
Theta (disperzija): 0.139 
Show code
cat("AIC:", round(AIC(m1)), "\n")
AIC: 3377737 
Show code
cat("Log-likelihood:", round(logLik(m1)), "\n")
Log-likelihood: -1688847 
Show code
cat("Residual deviance:", round(m1$deviance, 1), "na", m1$df.residual, "df\n")
Residual deviance: 446179.9 na 443117 df

4.2.2 Model 2: NPI umjesto individualnih okvira (IP2)

Show code
# Model 2a: linear NPI
formula_m2a <- as.formula(paste0(
  "engagement ~ disinfo_alignment_norm + media_fct + phase_fct + log_words"
))

m2a <- MASS::glm.nb(formula_m2a, data = analysis_data)

# Model 2b: quadratic NPI (test for nonlinearity)
analysis_data <- analysis_data |>
  mutate(npi_sq = disinfo_alignment_norm^2)

formula_m2b <- as.formula(paste0(
  "engagement ~ disinfo_alignment_norm + npi_sq + media_fct + phase_fct + log_words"
))

m2b <- MASS::glm.nb(formula_m2b, data = analysis_data)
Show code
m2a_tidy <- tidy(m2a, conf.int = TRUE, exponentiate = TRUE) |>
  filter(term == "disinfo_alignment_norm") |>
  mutate(model = "Linearni", term = "NPI") |>
  dplyr::select(model, term, estimate, conf.low, conf.high, p.value)

m2b_tidy <- tidy(m2b, conf.int = TRUE, exponentiate = TRUE) |>
  filter(term %in% c("disinfo_alignment_norm", "npi_sq")) |>
  mutate(
    model = "Kvadratni",
    term = ifelse(term == "disinfo_alignment_norm", "NPI", "NPI²")
  ) |>
  dplyr::select(model, term, estimate, conf.low, conf.high, p.value)

m2_compare <- bind_rows(m2a_tidy, m2b_tidy) |>
  mutate(
    across(c(estimate, conf.low, conf.high), ~round(.x, 4)),
    p_display = ifelse(p.value < 0.001, "< 0.001", sprintf("%.4f", p.value))
  )

kable(m2_compare |> dplyr::select(-p.value),
      col.names = c("Model", "Prediktor", "IRR", "CI donji", "CI gornji", "p")) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
# LR test for nonlinearity
lr_test <- anova(m2a, m2b)
cat("\nLikelihood ratio test (linearni vs. kvadratni):\n")

Likelihood ratio test (linearni vs. kvadratni):
Show code
cat("Chi-sq:", round(lr_test$`LR stat.`[2], 2), "p:", formatC(lr_test$`Pr(Chi)`[2], format = "e", digits = 3), "\n")
Chi-sq: 0.31 p: 5.802e-01 
Show code
cat("AIC linearni:", round(AIC(m2a)), "AIC kvadratni:", round(AIC(m2b)), "\n")
AIC linearni: 3378697 AIC kvadratni: 3378699 
Table 5: Tablica 6. NPI efekt na angažman: linearni vs. kvadratni model
Model Prediktor IRR CI donji CI gornji p
Linearni NPI 0.9989 0.9983 0.9995 < 0.001
Kvadratni NPI 0.9992 0.9980 1.0004 0.1742
Kvadratni NPI² 1.0000 1.0000 1.0000 0.5890

Linearni model testira je li viši NPI povezan s višim angažmanom. Kvadratni model testira je li odnos nelinearan, to jest raste li efekt sve brže kako NPI raste (konveksna krivulja) ili se efekt zasićuje na visokim razinama (konkavna krivulja). Značajan kvadratni član ukazuje na nelinearnost.

Show code
# Generate predictions across NPI range
npi_grid <- data.frame(
  disinfo_alignment_norm = seq(0, max(analysis_data$disinfo_alignment_norm, na.rm = TRUE), length.out = 100)
)
npi_grid$npi_sq <- npi_grid$disinfo_alignment_norm^2

# Use median values for other predictors
npi_grid$media_fct <- factor("Other", levels = levels(analysis_data$media_fct))
npi_grid$phase_fct <- factor(
  names(sort(table(analysis_data$phase_fct), decreasing = TRUE))[1],
  levels = levels(analysis_data$phase_fct)
)
npi_grid$log_words <- median(analysis_data$log_words, na.rm = TRUE)

pred_m2b <- predict(m2b, newdata = npi_grid, type = "response", se.fit = TRUE)
npi_grid$predicted <- pred_m2b$fit
npi_grid$se <- pred_m2b$se.fit
npi_grid$ci_low <- pmax(npi_grid$predicted - 1.96 * npi_grid$se, 0)
npi_grid$ci_high <- npi_grid$predicted + 1.96 * npi_grid$se

ggplot(npi_grid, aes(x = disinfo_alignment_norm, y = predicted)) +
  geom_ribbon(aes(ymin = ci_low, ymax = ci_high), alpha = 0.2, fill = "#e41a1c") +
  geom_line(color = "#e41a1c", linewidth = 1.2) +
  labs(
    x = "Narrative Proximity Index (NPI)",
    y = paste0("Predviđeni ", primary_outcome)
  )
Figure 4: Slika 4. Predviđeni angažman kao funkcija NPI (iz kvadratnog modela, s 95% CI)

Oblik krivulje otkriva prirodu odnosa. Ako krivulja raste strmije na višim razinama NPI, to znači da sadržaj s ekstremno visokim NPI generira disproporcionalno veći angažman, što ukazuje na pojačani selekcijski pritisak prema dezinformacijski bliskom sadržaju. Ako se krivulja splošnjava, efekt se zasićuje.

4.3 Interakcija okvira i tipa medija (IP3)

Ista narativna strategija može generirati različit angažman u različitim medijskim ekosustavu. CONSPIRACY okvir u katoličkim medijima može rezonirati s publikom koja već dijeli konspirativne okvire, dok isti okvir u liberalnim medijima može izazvati odbijanje. Ovo testiramo zasebnim modelima.

Show code
# Separate models for Catholic and Other media
analysis_catholic <- analysis_data |> filter(media_type == "Catholic")
analysis_other    <- analysis_data |> filter(media_type != "Catholic")

formula_sep <- as.formula(paste0(
  "engagement ~ ", paste(frame_cols, collapse = " + "), " + phase_fct + log_words"
))

m3_cath <- tryCatch(
  MASS::glm.nb(formula_sep, data = analysis_catholic),
  error = function(e) NULL
)

m3_other <- MASS::glm.nb(formula_sep, data = analysis_other)
Show code
extract_frame_irr <- function(model, label) {
  if (is.null(model)) return(NULL)
  tidy(model, conf.int = TRUE, exponentiate = TRUE) |>
    filter(str_detect(term, "^frame_")) |>
    mutate(
      term = str_remove(term, "frame_"),
      across(c(estimate, conf.low, conf.high), ~round(.x, 3)),
      p_display = ifelse(p.value < 0.001, "< 0.001", sprintf("%.3f", p.value)),
      source = label
    ) |>
    dplyr::select(source, term, estimate, conf.low, conf.high, p_display)
}

m3_cath_irr  <- extract_frame_irr(m3_cath, "Katolički")
m3_other_irr <- extract_frame_irr(m3_other, "Ostali")

m3_combined <- bind_rows(m3_cath_irr, m3_other_irr)

if (nrow(m3_combined) > 0) {
  kable(m3_combined,
        col.names = c("Podskup", "Okvir", "IRR", "CI donji", "CI gornji", "p")) |>
    kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
}
Table 6: Tablica 7. IRR po okviru: katolički mediji vs. ostali mediji (zasebni modeli)
Podskup Okvir IRR CI donji CI gornji p
Katolički MORAL_DECAYTRUE 1.347 1.256 1.447 < 0.001
Katolički FOREIGN_THREATTRUE 1.318 1.002 1.778 0.058
Katolički INSTITUTIONAL_DISTRUSTTRUE 1.035 0.986 1.087 0.163
Katolički TRADITIONAL_VALUESTRUE 0.770 0.733 0.809 < 0.001
Katolički SOVEREIGNTYTRUE 0.926 0.796 1.085 0.331
Katolički CONSPIRACYTRUE 0.934 0.805 1.092 0.380
Katolički FAITH_DEFENCETRUE 0.746 0.596 0.951 0.014
Katolički MEDIA_CRITIQUETRUE 1.009 0.819 1.259 0.935
Ostali MORAL_DECAYTRUE 1.417 1.364 1.472 < 0.001
Ostali FOREIGN_THREATTRUE 0.831 0.762 0.907 < 0.001
Ostali INSTITUTIONAL_DISTRUSTTRUE 0.972 0.952 0.993 0.008
Ostali TRADITIONAL_VALUESTRUE 1.164 1.144 1.186 < 0.001
Ostali SOVEREIGNTYTRUE 1.137 1.086 1.191 < 0.001
Ostali CONSPIRACYTRUE 1.009 0.966 1.055 0.681
Ostali FAITH_DEFENCETRUE 0.860 0.754 0.987 0.029
Ostali MEDIA_CRITIQUETRUE 1.019 0.961 1.081 0.526
Show code
if (nrow(m3_combined) > 0) {
  ggplot(m3_combined, aes(x = reorder(term, estimate), y = estimate,
                          color = source, shape = source)) +
    geom_point(size = 3, position = position_dodge(width = 0.4)) +
    geom_errorbar(aes(ymin = conf.low, ymax = conf.high),
                  width = 0.2, position = position_dodge(width = 0.4)) +
    geom_hline(yintercept = 1, linetype = "dashed", color = "gray50") +
    coord_flip() +
    scale_color_manual(values = c("Katolički" = "#e41a1c", "Ostali" = "#377eb8")) +
    labs(x = NULL, y = "IRR", color = NULL, shape = NULL)
}
Figure 5: Slika 5. Usporedba IRR po okviru: katolički (crveno) vs. ostali mediji (plavo)

Razlike u IRR između dva podskupa otkrivaju koji okviri specifično “rade” u katoličkom medijskom prostoru. Ako je IRR za CONSPIRACY u katoličkim medijima 1.50 a u ostalima 1.10, to znači da konspirativni okvir generira 50% više angažmana u katoličkim medijima ali samo 10% više u ostalima. Takva asimetrija sugerira da publika katoličkih medija specifično reagira na taj okvir.

4.4 Interakcija okvir × akter

Show code
if (nrow(analysis_catholic) > 0) {
  # For each actor-frame combination in Catholic media, compute mean engagement
  af_engagement <- expand.grid(
    actor = actor_cols,
    frame = frame_cols,
    stringsAsFactors = FALSE
  )

  af_engagement$mean_eng <- mapply(function(a, f) {
    subset <- analysis_catholic |>
      filter(.data[[a]] == TRUE & .data[[f]] == TRUE)
    if (nrow(subset) < 20) return(NA_real_)
    mean(subset$engagement, na.rm = TRUE)
  }, af_engagement$actor, af_engagement$frame)

  af_engagement <- af_engagement |>
    filter(!is.na(mean_eng)) |>
    mutate(
      actor = str_remove(actor, "actor_"),
      frame = str_remove(frame, "frame_")
    )

  if (nrow(af_engagement) > 0) {
    ggplot(af_engagement, aes(x = frame, y = actor, fill = mean_eng)) +
      geom_tile(color = "white") +
      geom_text(aes(label = round(mean_eng, 0)), size = 2.8) +
      scale_fill_gradient(low = "#deebf7", high = "#c0392b",
                          name = paste0("Prosj. ", primary_outcome)) +
      labs(x = NULL, y = NULL) +
      theme(axis.text.x = element_text(angle = 45, hjust = 1))
  }
}
Figure 6: Slika 6. Prosječni angažman po kombinaciji okvira i aktera u katoličkim medijima. Ćelije s manje od 20 članaka nisu prikazane.

Ova toplinska karta otkriva koje kombinacije aktera i okvira generiraju najviše angažmana u katoličkim medijima. Na primjer, članci koji spominju Crkvu (CHURCH) unutar okvira FAITH_DEFENCE mogu generirati drugačiji angažman nego članci koji spominju Vladu (GOVERNMENT) unutar okvira INSTITUTIONAL_DISTRUST. Ove kombinacije odražavaju specifične narativne situacije koje su osobito rezonirajuće za publiku katoličkih medija.

4.5 Vremenska dinamika angažmana

Show code
eng_ts <- analysis_data |>
  mutate(
    has_frame = ifelse(has_any_frame, "S okvirom", "Bez okvira"),
    group = ifelse(media_type == "Catholic", "Katolički", "Ostali")
  ) |>
  group_by(year_month, group, has_frame) |>
  summarise(mean_eng = mean(engagement, na.rm = TRUE), .groups = "drop") |>
  filter(!is.na(year_month))

ggplot(eng_ts, aes(x = year_month, y = mean_eng, color = has_frame, linetype = group)) +
  geom_smooth(method = "loess", se = TRUE, linewidth = 1, span = 0.3) +
  scale_color_manual(values = c("S okvirom" = "#e41a1c", "Bez okvira" = "#377eb8")) +
  scale_x_date(date_breaks = "6 months", date_labels = "%b\n%Y") +
  labs(
    x = NULL,
    y = paste0("Prosječni ", primary_outcome),
    color = NULL, linetype = "Medij"
  )
Figure 7: Slika 7. Prosječni angažman za članke s i bez okvira kroz vrijeme
Show code
eng_phase <- analysis_data |>
  filter(!is.na(narrative_phase)) |>
  mutate(npi_group = ifelse(disinfo_alignment_norm > 50, "Visoki NPI (>50)", "Niski NPI")) |>
  group_by(narrative_phase, npi_group) |>
  summarise(
    mean_eng = mean(engagement, na.rm = TRUE),
    n = n(),
    .groups = "drop"
  )

ggplot(eng_phase, aes(x = narrative_phase, y = mean_eng, fill = npi_group)) +
  geom_col(position = "dodge", alpha = 0.85) +
  scale_fill_manual(values = c("Visoki NPI (>50)" = "#e41a1c", "Niski NPI" = "#377eb8")) +
  labs(x = NULL, y = paste0("Prosječni ", primary_outcome), fill = NULL) +
  theme(axis.text.x = element_text(angle = 35, hjust = 1, size = 9))
Figure 8: Slika 8. Prosječni angažman po narativnoj fazi za članke s visokim NPI (>50) vs. niskim NPI

4.6 Dodatna raščlamba: vrsta reakcija

Show code
reaction_cols <- intersect(c("LIKE_COUNT", "LOVE_COUNT", "WOW_COUNT",
                              "HAHA_COUNT", "SAD_COUNT", "ANGRY_COUNT"),
                            names(analysis_data))

if (length(reaction_cols) >= 3) {
  reaction_data <- analysis_data |>
    mutate(npi_group = ifelse(disinfo_alignment_norm > 50, "Visoki NPI", "Niski NPI")) |>
    group_by(npi_group) |>
    summarise(across(all_of(reaction_cols), ~mean(.x, na.rm = TRUE)), .groups = "drop") |>
    pivot_longer(cols = all_of(reaction_cols), names_to = "reaction", values_to = "mean_count") |>
    mutate(reaction = str_remove(reaction, "_COUNT"))

  ggplot(reaction_data, aes(x = reorder(reaction, mean_count), y = mean_count,
                            fill = npi_group)) +
    geom_col(position = "dodge", alpha = 0.85) +
    coord_flip() +
    scale_fill_manual(values = c("Visoki NPI" = "#e41a1c", "Niski NPI" = "#377eb8")) +
    labs(x = NULL, y = "Prosječan broj reakcija", fill = NULL)
} else {
  cat("Detaljni podatci o vrstama reakcija nisu dostupni u korpusu.\n")
}
Figure 9: Slika 9. Prosječne reakcije po tipu za članke s visokim vs. niskim NPI (ako su podatci dostupni)

Ako su dostupni podatci o tipovima reakcija (like, love, wow, angry, sad), ova analiza otkriva kvalitativnu razliku u publičkom odgovoru. (brady2017emotion?) pokazuju da moralno nabijen sadržaj ne samo generira više reakcija nego privlači specifično emocionalne reakcije (angry, wow). Ako članci s visokim NPI generiraju disproporcionalno više angry reakcija, to ukazuje na emocionalni mehanizam amplifikacije.

4.7 Sumarni model

Show code
model_comparison <- tibble(
  Model = c(
    "M1: Individualni okviri + medij + faza + duljina",
    "M2a: NPI (linearni) + medij + faza + duljina",
    "M2b: NPI (kvadratni) + medij + faza + duljina"
  ),
  AIC = c(round(AIC(m1)), round(AIC(m2a)), round(AIC(m2b))),
  Theta = c(round(m1$theta, 3), round(m2a$theta, 3), round(m2b$theta, 3)),
  `Log-lik` = c(round(logLik(m1)), round(logLik(m2a)), round(logLik(m2b)))
)

kable(model_comparison) |>
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Table 7: Tablica 8. Usporedba modela po AIC
Model AIC Theta Log-lik
M1: Individualni okviri + medij + faza + duljina 3377737 0.139 -1688847
M2a: NPI (linearni) + medij + faza + duljina 3378697 0.138 -1689333
M2b: NPI (kvadratni) + medij + faza + duljina 3378699 0.138 -1689333

Niži AIC ukazuje na bolji model. Usporedba M1 i M2a govori o tome je li informativnije koristiti individualne okvire ili kompozitni NPI za predviđanje angažmana. Usporedba M2a i M2b govori o linearnosti odnosa NPI i angažmana.

5 Diskusija

Rezultati ovog istraživanja adresiraju pitanje postoji li strukturni poticaj za produkciju sadržaja s narativnim karakteristikama bliskim dezinformacijskom ekosustavu u hrvatskom medijskom prostoru.

Specifični okviri predviđaju angažman (IP1). Negativna binomijalna regresija otkriva da prisutnost specifičnih okvira sistematski predviđa viši angažman, i nakon kontrole za tip medija, vremensko razdoblje i duljinu članka. Ovaj nalaz je konzistentan s literaturom o emocionalnom i moralnom naboju kao pokretaču dijeljenja (brady2017emotion?). No ključno je da nisu svi okviri jednako efektni: neki okviri mogu biti negativno asocirani s angažmanom (IRR < 1), što sugerira da publika selektivno reagira na specifične narativne strukture.

NPI i angažman (IP2). Analiza odnosa kompozitnog NPI i angažmana pokazuje je li veća strukturna bliskost s dezinformacijskim narativima konzistentno nagrađena većim angažmanom. Oblik krivulje (linearan, konveksan ili konkavan) ima implikacije za razumijevanje mehanizma. Konveksna krivulja (efekt raste na visokim NPI razinama) ukazuje na snažan selekcijski pritisak prema ekstremnom sadržaju. Konkavna krivulja (efekt se zasićuje) sugerira da postoji prag iznad kojeg daljnje povećanje NPI ne donosi dodatni angažman.

Asimetrija između medijskih tipova (IP3). Zasebni modeli otkrivaju da isti okvir može generirati različit angažman u različitim medijskim ekosustavu. Ova asimetrija sugerira da dinamika amplifikacije nije univerzalna nego je kontekstualna, što je konzistentno s (benkler2018network?) nalazom o asimetričnoj polarizaciji medijskog sustava. Za katoličke medije, ovo znači da njihova specifična publika može pojačavati određene okvire koji u drugim medijskim kontekstima ne generiraju isti stupanj angažmana.

Implikacije za medijski ekosustav. Ako je sadržaj s narativnim karakteristikama bliskim dezinformacijskom ekosustavu konzistentno nagrađen većim angažmanom, to implicira ekonomski poticaj za produkciju takvog sadržaja. Medijski izdavači koji maksimiziraju klikove, komentare i dijeljenja imaju racionalnu (ako ne i etičku) motivaciju za korištenje okvira poput CONSPIRACY ili INSTITUTIONAL_DISTRUST. (pennycook2021psychology?) argumentiraju da se ovaj problem ne može riješiti isključivo na razini publike (poticanjem kritičkog mišljenja) nego zahtijeva strukturne intervencije u dizajnu platformi i algoritama preporuke.

5.1 Ograničenja

Ovo istraživanje ima pet važnih ograničenja. Prvo, metrike angažmana nisu dostupne za sve članke u korpusu, što uvodi selekcijski bias jer Determ bilježi angažman samo za izvore koje aktivno prati. Drugo, web angažman (interakcije na stranici) ne obuhvaća sve kanale amplifikacije, poput dijeljenja putem messaging aplikacija ili usmene preporuke. Treće, kauzalna interpretacija je ograničena jer opažena korelacija između okvira i angažmana može biti pod utjecajem nenabludljivih konfundirača (npr. senzacionalnosti naslova, vizualnog sadržaja, pozicije na naslovnici). Četvrto, negativna binomijalna regresija pretpostavlja da su koeficijenti konstantni kroz vrijeme, što ne mora biti slučaj ako se ponašanje publike mijenja. Peto, rječnička metoda detekcije okvira unosi šum u prediktorske varijable, što atenuira koeficijente (bias prema nuli), pa su prikazani IRR konzervativne procjene stvarnog efekta.

6 Zaključak

Show code
cat("KLJUČNI NALAZI\n")
KLJUČNI NALAZI
Show code
cat("==============\n\n")
==============
Show code
cat("IP1: Individualni okviri predviđaju angažman nakon kontrole za kovarijate\n")
IP1: Individualni okviri predviđaju angažman nakon kontrole za kovarijate
Show code
cat("IP2: NPI-angažman odnos testiran na linearnost i nelinearnost\n")
IP2: NPI-angažman odnos testiran na linearnost i nelinearnost
Show code
cat("IP3: Amplifikacijski obrasci razlikuju se između katoličkih i ostalih medija\n\n")
IP3: Amplifikacijski obrasci razlikuju se između katoličkih i ostalih medija
Show code
cat("ANALITIČKI KORPUS:", format(n_analysis, big.mark = ","), "članaka s podatcima o angažmanu\n")
ANALITIČKI KORPUS: 443,138 članaka s podatcima o angažmanu
Show code
cat("PRIMARY OUTCOME:", primary_outcome, "\n")
PRIMARY OUTCOME: INTERACTIONS 
Show code
cat("MODELI: Negativna binomijalna regresija (M1, M2a, M2b, M3)\n")
MODELI: Negativna binomijalna regresija (M1, M2a, M2b, M3)

Ovo istraživanje pokazuje da narativni okviri nisu samo obilježja medijskog sadržaja nego i prediktori publičkog angažmana. Specifični okviri generiraju sistematski viši angažman, a ovaj efekt varira između tipova medija, što sugerira kontekstualno uvjetovanu dinamiku amplifikacije. Nalazi imaju praktične implikacije za medijske regulatore, platformske algoritme i medijsku pismenost: razumijevanje koje narativne strukture publika nagrađuje nužan je preduvjet za bilo kakvu intervenciju u medijskom ekosustavu. Budući rad trebao bi uključiti panel dizajn za kauzalnu identifikaciju, proširenje na društvene mreže gdje je angažman transparentniji, i eksperimentalne studije koje testiraju mehanizme (emocionalna aktivacija vs. identitetska rezonancija) kojima okviri generiraju angažman.

7 Tehničke informacije

Show code
sessionInfo()
R version 4.5.2 (2025-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 22631)

Matrix products: default
  LAPACK version 3.12.1

locale:
[1] LC_COLLATE=Croatian_Croatia.utf8  LC_CTYPE=Croatian_Croatia.utf8   
[3] LC_MONETARY=Croatian_Croatia.utf8 LC_NUMERIC=C                     
[5] LC_TIME=Croatian_Croatia.utf8    

time zone: Europe/Zagreb
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] marginaleffects_0.31.0 MASS_7.3-65            broom_1.0.10          
 [4] kableExtra_1.4.0       knitr_1.50             ggrepel_0.9.6         
 [7] patchwork_1.3.2        scales_1.4.0           ggplot2_4.0.1         
[10] tibble_3.3.0           forcats_1.0.1          lubridate_1.9.4       
[13] stringi_1.8.7          stringr_1.6.0          tidyr_1.3.1           
[16] dplyr_1.1.4           

loaded via a namespace (and not attached):
 [1] generics_0.1.4     xml2_1.5.1         lattice_0.22-7     digest_0.6.39     
 [5] magrittr_2.0.4     evaluate_1.0.5     grid_4.5.2         timechange_0.3.0  
 [9] RColorBrewer_1.1-3 fastmap_1.2.0      Matrix_1.7-4       rprojroot_2.1.1   
[13] jsonlite_2.0.0     backports_1.5.0    mgcv_1.9-3         purrr_1.2.0       
[17] viridisLite_0.4.2  textshaping_1.0.4  cli_3.6.5          rlang_1.1.6       
[21] splines_4.5.2      withr_3.0.2        yaml_2.3.11        tools_4.5.2       
[25] here_1.0.2         vctrs_0.6.5        R6_2.6.1           lifecycle_1.0.4   
[29] htmlwidgets_1.6.4  pkgconfig_2.0.3    pillar_1.11.1      gtable_0.3.6      
[33] data.table_1.17.8  glue_1.8.0         Rcpp_1.1.0         systemfonts_1.3.1 
[37] xfun_0.54          tidyselect_1.2.1   rstudioapi_0.17.1  dichromat_2.0-0.1 
[41] farver_2.1.2       nlme_3.1-168       htmltools_0.5.8.1  labeling_0.4.3    
[45] rmarkdown_2.30     svglite_2.2.2      compiler_4.5.2     S7_0.2.1          

Reference